<?php
/**
 * 自动备份天气数据库，并发送到邮箱，每天1:00，9:00，17:00各执行一次
 */
set_time_limit(300);
global $config;
chdir("/data/www/w.mdeve.com/htdocs/");
require 'runtime.php';
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
$dump_proc = "/usr/local/mariadb/bin/mysqldump";
$data_dir = getcwd() . "/data/db_backup/";
$backup_filename = $config['db']['dbname']. "_". date("YmdHi"). ".sql";
$command_line = "{$dump_proc} " . $config['db']['dbname'] . " -h 127.0.0.1 -u " . $config['db']['user'] . " -p" . $config['db']['pass'] . " > {$data_dir}{$backup_filename}";
//////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 备份系统设置
/*
tar czvf /tmp/etc.tar.gz /etc
tar czvf /tmp/nginx.tar.gz /usr/local/nginx/
tar czvf /tmp/php.tar.gz /usr/local/php/etc
tar czvf /tmp/proftpd.tar.gz /usr/local/proftpd/etc
tar czvf /tmp/nginx.tar.gz /usr/local/nginx/
*/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(!file_exists($data_dir)) mkdir($data_dir);
// 导出数据库
exec($command_line, $result, $return_var);
if($return_var != 0) exit("Database backup failed!");
$backup_file_size =  filesize($data_dir . $backup_filename);
if(!$backup_file_size) exit("Backup file failed!");
// 压缩数据库
$zip_file = $data_dir. $backup_filename. ".zip";
// 如果文件存在则干掉它
if(file_exists($zip_file)) {
	if(!unlink($zip_file)) exit("Cannot delete old zip file.");
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
$zip = new ZipArchive();
// 创建zip
if($zip->open($zip_file, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE)){
	// 增加文件
	$zip->addFile("{$data_dir}/{$backup_filename}", $backup_filename);
	$zip->close();
}else{
	exit("Cannot open {$zip_file} for writing.");
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 用电子邮件发送附件
require 'library/PHPMailer/class.phpmailer.php';
$mail = new PHPMailer (); // 创建实例
$mail->CharSet = 'utf-8'; // 设置字符集
$mail->SetLanguage ( 'ch', 'library/PHPMailer/language/' ); // 设置语言类型和语言文件所在目录
$mail->IsSMTP (); // 使用SMTP方式发送
$mail->SMTPAuth = true; // 设置服务器是否需要SMTP身份验证
$mail->Host = "smtp.qq.com"; // SMTP 主机地址
$mail->Port = 25; // SMTP 主机端口
$mail->From = "nczy520@qq.com"; // 发件人EMAIL地址
$mail->FromName = '阿枫'; // 发件人在SMTP主机中的用户名
$mail->Username = "nczy520"; // 发件人的姓名
$mail->Password = base64_decode ( base64_decode ( "U1c1bWJ6Z3lYek16TmpFag==" ) ); // 发件人在SMTP主机中的密码
$mail->Subject = date("天气源数据备份 - Y-m-d H:i"); // 邮件主题
$mail->AltBody = 'text/html'; // 设置在邮件正文不支持HTML时的备用显示
$mail->Body = "天气源数据备份"; // 邮件内容做成
$mail->IsHTML ( true ); // 是否是HTML邮件
$mail->AddAddress ( 'support@mdeve.com', '阿枫' ); // 收件人的地址和姓名
$mail->AddAttachment ($zip_file, $backup_filename. ".zip" ); // 附件的路径和附件名称
if (! $mail->Send ()) {
	echo "Mailer Error: " . $mail->ErrorInfo;
} else {
	echo "Message sent!";
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 清理
unlink($zip_file);
unlink("{$data_dir}/{$backup_filename}");
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
echo "All done";









function ZipStatusString( $status ){
	switch( (int) $status ){
		case ZipArchive::ER_OK           : return 'N No error';
		case ZipArchive::ER_MULTIDISK    : return 'N Multi-disk zip archives not supported';
		case ZipArchive::ER_RENAME       : return 'S Renaming temporary file failed';
		case ZipArchive::ER_CLOSE        : return 'S Closing zip archive failed';
		case ZipArchive::ER_SEEK         : return 'S Seek error';
		case ZipArchive::ER_READ         : return 'S Read error';
		case ZipArchive::ER_WRITE        : return 'S Write error';
		case ZipArchive::ER_CRC          : return 'N CRC error';
		case ZipArchive::ER_ZIPCLOSED    : return 'N Containing zip archive was closed';
		case ZipArchive::ER_NOENT        : return 'N No such file';
		case ZipArchive::ER_EXISTS       : return 'N File already exists';
		case ZipArchive::ER_OPEN         : return 'S Can\'t open file';
		case ZipArchive::ER_TMPOPEN      : return 'S Failure to create temporary file';
		case ZipArchive::ER_ZLIB         : return 'Z Zlib error';
		case ZipArchive::ER_MEMORY       : return 'N Malloc failure';
		case ZipArchive::ER_CHANGED      : return 'N Entry has been changed';
		case ZipArchive::ER_COMPNOTSUPP  : return 'N Compression method not supported';
		case ZipArchive::ER_EOF          : return 'N Premature EOF';
		case ZipArchive::ER_INVAL        : return 'N Invalid argument';
		case ZipArchive::ER_NOZIP        : return 'N Not a zip archive';
		case ZipArchive::ER_INTERNAL     : return 'N Internal error';
		case ZipArchive::ER_INCONS       : return 'N Zip archive inconsistent';
		case ZipArchive::ER_REMOVE       : return 'S Can\'t remove file';
		case ZipArchive::ER_DELETED      : return 'N Entry has been deleted';

		default: return sprintf('Unknown status %s', $status );
	}
}

